package org.dubnation.base.interceptors;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import org.dubnation.auth.context.LoginContext;
import org.dubnation.base.annotation.DubnationPermission;
import org.dubnation.org.domain.Employee;
import org.dubnation.org.service.IEmployeeService;
import org.dubnation.user.domain.User;
import org.dubnation.user.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Iterator;
import java.util.List;
import java.util.Objects;

/**
 * 定义拦截器
 */
@Component
public class AuthenticInterceptor implements HandlerInterceptor {

    @Autowired
    private IEmployeeService employeeService;

    @Autowired
    private IUserService userService;

    public static String loginToken;

    /**
     * 前置拦截，拦截请求判断是否登录，授权
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//        //接收前端传的token
//        String token = request.getHeader("token");
//        JSONArray jsonArray = JSONArray.parseArray(token);
//        //判断token是否为空
//        if (jsonArray.size() == 0){
//            //前端传的token为空，没有登录过
//            response.getWriter().println("{\"success\":false,\"message\":\"noLogin\"}");
//            return false;
//        }
//        //获取存储在后端redis中的登录用户信息，判断其是否存在
//        Iterator<Object> loginIterator = jsonArray.stream().iterator();
//        Object loginAdmin = null;
//        Long loginCount = 0L; //统计登录人员个数
//        String webToken = null;
//        while (loginIterator.hasNext()) {
//            JSONObject jsonObject = (JSONObject) loginIterator.next();
//            webToken = jsonObject.get("token").toString();
//            loginToken = webToken;
//            loginAdmin = LoginContext.getLoginAdmin();
//            //判断前端传到后端的token是否存在于后端中
//            if (Objects.nonNull(loginAdmin)){
//                //后端redis中有该登录人员信息
//                loginCount++;
//            }
//        }
//        //后端没有存储登录人员信息
//        if (loginCount == 0L){
//            response.getWriter().println("{\"success\":false,\"message\":\"noLogin\"}");
//            return false;
//        }
//
//        /*
//        * 鉴权
//        * */
//        //拦截请求之后需要判断该用户是否有访问资源的权限
//        if (!(handler instanceof HandlerMethod)){
//            return false;
//        }
//        HandlerMethod handlerMethod = (HandlerMethod) handler;
//        //获取Controller类的名字，判断是否有权限
//        DubnationPermission clazzAnnotation = handlerMethod.getBeanType().getAnnotation(DubnationPermission.class);
//        if (StringUtils.isEmpty(clazzAnnotation)){
//            //该Controller类资源没有权限，任何用户都可以访问，直接放行
//            return true;
//        }
//        //类有权限，判断访问的方法是否有权限
//        DubnationPermission methodAnnotation = handlerMethod.getMethod().getAnnotation(DubnationPermission.class);
//        if (StringUtils.isEmpty(methodAnnotation)){
//            //访问的方法没有权限，放行
//            return true;
//        }
//        //访问的资源有权限
//        //获取该资源的权限
//        String clazzName = handlerMethod.getBeanType().getSimpleName();
//        String methodName = handlerMethod.getMethod().getName();
//        String resourcePermissionSn = clazzName + ":" + methodName; //访问的资源权限
//        //获取访问该资源用户的权限
//        /**
//         * @TODO Employee还是User
//         */
//        List<String> adminPermissionSn = null;
//        if (loginAdmin instanceof User){
//            User user = (User) loginAdmin;
//            adminPermissionSn = userService.getPermissionSn(user.getId());
//        }else if (loginAdmin instanceof Employee){
//            Employee employee = (Employee) loginAdmin;
//            adminPermissionSn = employeeService.getPermissionSn(employee.getId());
//        }
//        //判断用户拥有的权限sn是否与被访问资源的权限sn一致
//        if (!adminPermissionSn.contains(resourcePermissionSn)){
//            //该用户没有访问该资源的权限
//            response.getWriter().println("{\"success\":false,\"message\":\"noPermission\"}");
//            return false;
//        }
        return true;
    }
}
